
#include "stdio.h"
#include "stdint.h"
#include "stdbool.h"

#include "svc_test.h"

#include "rtthread.h"
#include "rthw.h"
#include <ARMCM4.h>

/* flag 必须定义成全局变量才能添加到逻辑分析仪里面观察波形
* 在逻辑分析仪中要设置以 bit 的模式才能看到波形，不能用默认的模拟量
*/
uint32_t flag1 = 0;
uint32_t flag2 = 0;
uint32_t flag3 = 0;

struct rt_thread rt_flag1_thread;
struct rt_thread rt_flag2_thread;
struct rt_thread rt_flag3_thread;

/* 定义线程栈 */
ALIGN(RT_ALIGN_SIZE)
rt_uint8_t rt_flag1_thread_stack[1024];
ALIGN(RT_ALIGN_SIZE)
rt_uint8_t rt_flag2_thread_stack[1024];
ALIGN(RT_ALIGN_SIZE)
rt_uint8_t rt_flag3_thread_stack[1024];


extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];

/* 软件延时，不必纠结具体的时间 */
void delay( uint32_t count )
{
		for (; count!=0; count--);
}


/*线程1*/
void flag1_thread_entry( void *p_arg )
{
		for(;;)
		{
			flag1 = 1;
			//delay(10000);
			rt_thread_delay(2);
			flag1 = 0;
			//delay(10000);
			rt_thread_delay(2);
		}
}

/*线程2*/
void flag2_thread_entry( void *p_arg )
{
		for(;;)
		{
			flag2 = 1;
			delay(10000);
			//rt_thread_delay(4);
			flag2 = 0;
			delay(10000);
			//rt_thread_delay(4);
		}
}

/*线程3*/
void flag3_thread_entry( void *p_arg )
{
		for(;;)
		{
			flag3 = 1;
			delay(10000);
			//rt_thread_delay(3);
			flag3 = 0;
			delay(10000);
			//rt_thread_delay(3);
		}
}


/*
************************************************************************
* main 函数
************************************************************************
*/
int main(void)
{
		printf("********* main *********\r\n");
		//test_array_fuzhi();
		//test_add();//测试SVC异常使用，需要开启全局中断
		//test_show_bitmap();
		/* 硬件初始化 */
		/* 将硬件相关的初始化放在这里，如果是软件仿真则没有相关初始化代码 */
		/* 关中断 */
		rt_hw_interrupt_disable();
		/* SysTick 中断频率设置 */
		SysTick_Config( SystemCoreClock / RT_TICK_PER_SECOND );
		
		/* 系统定时器列表初始化 */
		rt_system_timer_init();
	
		/* 调度器初始化 */
		rt_system_scheduler_init();
	
		/* 初始化空闲线程 */
		rt_thread_idle_init();
		
		/* 初始化用户线程1 */
		rt_thread_init( &rt_flag1_thread, /* 线程控制块 */
										"flag1_thread",		/* 线程名称 */
										flag1_thread_entry, /* 线程入口地址 */
										RT_NULL, /* 线程形参 */
										&rt_flag1_thread_stack[0], /* 线程栈起始地址 */
										sizeof(rt_flag1_thread_stack) , /* 线程栈大小，单位为字节 */
										2,	/* 线程优先级 */
										2); /* 时间片 */
		//		rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );
		rt_thread_startup(&rt_flag1_thread);
		/* 初始化用户线程2 */
		rt_thread_init( &rt_flag2_thread, /* 线程控制块 */
										"flag2_thread",		/* 线程名称 */
										flag2_thread_entry, /* 线程入口地址 */
										RT_NULL, /* 线程形参 */
										&rt_flag2_thread_stack[0], /* 线程栈起始地址 */
										sizeof(rt_flag2_thread_stack) , /* 线程栈大小，单位为字节 */
										3,	/* 线程优先级 */
										2); /* 时间片,同优先级的线程则无效 */
		rt_thread_startup(&rt_flag2_thread);
		/* 初始化用户线程3 */
		rt_thread_init( &rt_flag3_thread, /* 线程控制块 */
										"flag3_thread",		/* 线程名称 */
										flag3_thread_entry, /* 线程入口地址 */
										RT_NULL, /* 线程形参 */
										&rt_flag3_thread_stack[0], /* 线程栈起始地址 */
										sizeof(rt_flag3_thread_stack) , /* 线程栈大小，单位为字节 */
										3,	/* 线程优先级 */
										3); /* 时间片 */
		rt_thread_startup(&rt_flag3_thread);
		/* 启动系统调度器 */
		rt_system_scheduler_start();
}


/* 滴答定时器异常中断函数 */
void SysTick_Handler(void)
{
		/* 进入中断 */
		rt_interrupt_enter();
		
		/* 时基更新 */
		rt_tick_increase();
		/* 离开中断 */
		rt_interrupt_leave();
}


/************************ end of file *************************/
